En esta práctica aprenderemos a leer diferentes tipos de imágenes usando OpenCV en Python.
Trabajaremos en un entorno local con Anaconda, lo que nos permite usar bibliotecas adicionales para manejar formatos que OpenCV no soporta de forma nativa.
OpenCV soporta de forma directa formatos como:
JPG / JPEG: compresión con pérdida
PNG: compresión sin pérdida y canal alfa
TIFF: admite profundidad de bits alta y múltiples páginas
BMP: sin compresión, usado en entornos Windows
Para formatos RAW (archivos de cámaras digitales, como .CR2, .NEF, .ARW), usaremos la librería rawpy junto con imageio, ya que OpenCV no los soporta directamente.
Configuración inicial
Code
import cv2import numpy as npimport matplotlib.pyplot as pltimport rawpyimport imageio.v2 as imageiofrom pathlib import Path# Función auxiliar para mostrar imágenes en escala de grises o colordef mostrar_img(img, titulo="Imagen", cmap=None): plt.figure(figsize=(5,5))iflen(img.shape) ==2: # Escala de grises plt.imshow(img, cmap='gray')else: # Color (BGR a RGB para mostrar correctamente) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title(titulo) plt.axis('off') plt.show()
Lectura de imágenes comunes con OpenCV
Code
# Ruta a las imágenes (ajustar según tu carpeta local)carpeta = Path("imagenes")# JPGimg_jpg = cv2.imread(str(carpeta /"frutas.jpg"))mostrar_img(img_jpg, "Imagen JPG")# PNG con canal alfa (transparencia)img_png = cv2.imread(str(carpeta /"373-3730435_paloma-dibujo-png.png"), cv2.IMREAD_UNCHANGED)mostrar_img(img_png[:, :, :3], "Imagen PNG (RGB)")# TIFF en escala de grisesimg_tiff = cv2.imread(str(carpeta /"DPP0357.TIF"), cv2.IMREAD_GRAYSCALE)mostrar_img(img_tiff, "Imagen TIFF (grises)")# TIFF en escala de colorimg_tiff2 = cv2.imread(str(carpeta /"DPP0357.TIF"), cv2.IMREAD_UNCHANGED)mostrar_img(img_tiff2, "Imagen TIFF")
Lectura de imágenes RAW
OpenCV no puede leer directamente formatos RAW de cámaras digitales. Usaremos rawpy para convertirlos a un arreglo NumPy.
Code
# Ejemplo con un archivo RAW (CR3 de Canon, NEF de Nikon, etc.)ruta_raw = carpeta /"IMG_0531.CR3"with rawpy.imread(str(ruta_raw)) as raw: rgb = raw.postprocess()# raw.postprocess() devuelve un arreglo RGB de 8 bitsmostrar_img(rgb, "Imagen RAW procesada")plt.imshow(rgb)plt.title("Imagen RAW directa")plt.axis('off')plt.show()
Notas importantes
Espacios de color: OpenCV usa BGR por defecto para imágenes en color. Al mostrar con Matplotlib, es necesario convertir a RGB.
Canales alfa: Si la imagen tiene transparencia (por ejemplo, PNG con 4 canales), OpenCV la carga con el canal alfa incluido si usamos cv2.IMREAD_UNCHANGED.
Compatibilidad RAW: Los formatos RAW varían entre fabricantes; rawpy está basado en libraw, que ofrece soporte para una amplia variedad de cámaras.
Conclusión
En este ejemplo hemos cubierto la lectura de:
Imágenes estándar soportadas por OpenCV (JPG, PNG, TIFF, BMP)
Archivos RAW usando bibliotecas externas
Esto nos permite trabajar con una amplia variedad de formatos en un flujo de procesamiento digital de imágenes.